wayland: check parent surface for subsurface
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 16 May 2017 14:13:34 +0000 (16:13 +0200)
committerOlivier Fourdan <ofourdan@redhat.com>
Fri, 2 Jun 2017 13:43:06 +0000 (15:43 +0200)
When an event is received while a tooltip is showing, the GtkTooltip's
event handling code can end up calling gdk_window_set_transient_for()
from gtk_tooltip_set_last_window().

The Wayland GDK backend will try to automatically create a subsurface
in gdk_wayland_window_set_transient_for() but if the parent surface is
gone meanwhile, this will will cause a crash when trying to create a
subsurface from a parent with a null surface.

Checking for the parent is not sufficient, we ought to check for the
parent surface as well to avoid the crash.

https://bugzilla.gnome.org/show_bug.cgi?id=782283

gdk/wayland/gdkwindow-wayland.c

index 95b74dfdd49b5a6e16877858832ad96a1d2fb906..6e78de860ba20a862c5c2b01c61bd627c6bac6fd 100644 (file)
@@ -1312,7 +1312,7 @@ gdk_wayland_window_create_subsurface (GdkWindow *window)
   if (impl->transient_for)
     parent_impl = GDK_WINDOW_IMPL_WAYLAND (impl->transient_for->impl);
 
-  if (parent_impl)
+  if (parent_impl && parent_impl->display_server.wl_surface)
     {
       display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
       impl->display_server.wl_subsurface =